package com.edu.policy.utils;

import lombok.extern.log4j.Log4j2;

import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;

@Log4j2
public class ParseUtil {
    /**
     ***** 功能码 0x01: 解析除尘器信息
     * 公司名称、设备名称、设备规格以汉语拼音ASCII码形式填写数据域
     * */
    private static String handleFunctionCode01(int deviceAddress, byte[] data) {
        String asciiText = new String(data, StandardCharsets.US_ASCII);
        log.info("0x01设备编码: " + deviceAddress + ", 数据: " + asciiText);
        return asciiText;
    }

    /**
     ***** 功能码 0x02: 解析主图信息
     * 使用12个字节分别表示
     * 当前工作孔位、
     * 移动喷吹位置、
     * 机器人位置、
     * 当前滤袋状态（破损、正常、已封堵）、
     * 机器人工作状态
     * */
    private static String handleFunctionCode02(int deviceAddress, byte[] data) {
        if (data.length != 12) {
            System.out.println("Invalid data length for Function Code 0x02.");
            return "";
        }
        int workingPosition = data[0] & 0xFF;
        int blowingPosition = data[1] & 0xFF;
        int robotPosition = data[2] & 0xFF;
        String bagStatus = getStatus(data[3]);
        String robotStatus = getStatus(data[4]);
        log.info("0x02设备编码: " + deviceAddress + ", 当前工作孔位: " + workingPosition +
                ", 移动喷吹位置: " + blowingPosition + ", 机器人位置: " + robotPosition +
                ", 当前滤袋状态: " + bagStatus + ", 机器人工作状态: " + robotStatus);
        return workingPosition + "#" +
                blowingPosition + "#" +
                robotPosition + "#" +
                bagStatus + "#" +
                robotStatus;
    }
    // 当前滤袋状态 判断
    private static String getStatus(byte status) {
        return switch (status) {
            case 0x00 -> "正常";
            case 0x01 -> "破损";
            case 0x02 -> "已封堵";
            default -> "未知";
        };
    }
    /**
     ***** 功能码 0x03: 操作信息
     * 传输当前系统状态，使用 5 个字节依次表示状态信息：
     * 系统急停状态（0：无效，1：有效）
     * 设备急停状态（0：无效，1：有效）
     * 设备复位状态（0：无效，1：有效）
     * 隔离门状态（0：关闭，1：打开）
     * 自动工作状态（0：启动，1：停止）
     * */
    private static String handleFunctionCode03(int deviceAddress, byte[] data) {
        if (data.length != 5) {
            System.out.println("Invalid data length for Function Code 0x03.");
            return "";
        }

        boolean systemEmergency = data[0] == 1;
        boolean deviceEmergency = data[1] == 1;
        boolean deviceReset = data[2] == 1;
        boolean isolationDoor = data[3] == 1;
        boolean autoWorking = data[4] == 1;

        log.info("0x03设备编码: " + deviceAddress +
                ", 系统急停状态: " + systemEmergency +
                ", 设备急停状态: " + deviceEmergency +
                ", 设备复位状态: " + deviceReset +
                ", 隔离门状态: " + isolationDoor +
                ", 自动工作状态: " + autoWorking);
        return systemEmergency + "#" +
                deviceEmergency + "#" +
                deviceReset + "#" +
                isolationDoor + "#" +
                autoWorking;
    }
    /**
     ***** 功能码 0x04：除尘器工作参数
     * 每个参数占 2 个字节
     * 上传压差、
     * 破损滤袋个数、
     * 封堵滤袋个数、
     * 失效率
     * */
    private static String handleFunctionCode04(int deviceAddress, byte[] data) {
        if (data.length != 8) {
            System.out.println("Invalid data length for Function Code 0x04.");
            return "";
        }

        int pressureDifference = ((data[0] & 0xFF) << 8) | (data[1] & 0xFF);
        int brokenBags = ((data[2] & 0xFF) << 8) | (data[3] & 0xFF);
        int blockedBags = ((data[4] & 0xFF) << 8) | (data[5] & 0xFF);
        int failureRate = ((data[6] & 0xFF) << 8) | (data[7] & 0xFF);

        log.info("0x04设备编码: " + deviceAddress +
                ", 上传压差: " + pressureDifference +
                ", 破损滤袋个数: " + brokenBags +
                ", 封堵滤袋个数: " + blockedBags +
                ", 失效率: " + failureRate);
        return  pressureDifference + "#" +
                brokenBags + "#" +
                blockedBags + "#" +
                failureRate;
    }
    /**
     ***** 功能码 0x05：控制室、净气室环境状态
     * 控制室和净气室的各项参数，每个参数占 2 个字节，依次为：
     * 控制室：温度、湿度、水浸、烟感、门禁、空调、气路压力
     * 净气室：温度、湿度、水浸、烟感、空调、气路压力
     * */
    private static String handleFunctionCode05(int deviceAddress, byte[] data) {
        if (data.length != 28) { // 每个参数2字节，共14个参数
            System.out.println("Invalid data length for Function Code 0x05.");
            return "";
        }

        // 控制室参数
        int controlRoomTemp = ((data[0] & 0xFF) << 8) | (data[1] & 0xFF);
        int controlRoomHumidity = ((data[2] & 0xFF) << 8) | (data[3] & 0xFF);
        int controlRoomWater = ((data[4] & 0xFF) << 8) | (data[5] & 0xFF);
        int controlRoomSmoke = ((data[6] & 0xFF) << 8) | (data[7] & 0xFF);
        int controlRoomAccess = ((data[8] & 0xFF) << 8) | (data[9] & 0xFF);
        int controlRoomAC = ((data[10] & 0xFF) << 8) | (data[11] & 0xFF);
        int controlRoomPressure = ((data[12] & 0xFF) << 8) | (data[13] & 0xFF);

        // 净气室参数
        int cleanRoomTemp = ((data[14] & 0xFF) << 8) | (data[15] & 0xFF);
        int cleanRoomHumidity = ((data[16] & 0xFF) << 8) | (data[17] & 0xFF);
        int cleanRoomWater = ((data[18] & 0xFF) << 8) | (data[19] & 0xFF);
        int cleanRoomSmoke = ((data[20] & 0xFF) << 8) | (data[21] & 0xFF);
        int cleanRoomAC = ((data[22] & 0xFF) << 8) | (data[23] & 0xFF);
        int cleanRoomPressure = ((data[24] & 0xFF) << 8) | (data[25] & 0xFF);

        log.info("0x05设备编码: " + deviceAddress +
                ", 控制室：温度=" + controlRoomTemp +
                ", 湿度=" + controlRoomHumidity +
                ", 水浸=" + controlRoomWater +
                ", 烟感=" + controlRoomSmoke +
                ", 门禁=" + controlRoomAccess +
                ", 空调=" + controlRoomAC +
                ", 气路压力=" + controlRoomPressure +
                ", 净气室：温度=" + cleanRoomTemp +
                ", 湿度=" + cleanRoomHumidity +
                ", 水浸=" + cleanRoomWater +
                ", 烟感=" + cleanRoomSmoke +
                ", 空调=" + cleanRoomAC +
                ", 气路压力=" + cleanRoomPressure);
        return controlRoomTemp + "#" +
                controlRoomHumidity + "#" +
                controlRoomWater + "#" +
                controlRoomSmoke + "#" +
                controlRoomAccess + "#" +
                controlRoomSmoke + "#" +
                controlRoomAC + "#" +
                controlRoomPressure + "#" +
                cleanRoomTemp + "#" +
                cleanRoomHumidity + "#" +
                cleanRoomWater + "#" +
                cleanRoomSmoke + "#" +
                cleanRoomAC + "#" +
                cleanRoomPressure;
    }

    /**
     ***** 功能码 0x06：喷吹、机器人、换轨滑台状态
     * 每组参数包含 4 个字节，共 3 组，每组依次表示：
     * 位置、温度、故障信息、工作状态、隔离门状态
     * */
    //TODO 字面上写了五个参数，但是文档提示有六个参数
    private static String handleFunctionCode06(int deviceAddress, byte[] data) {
        if (data.length != 72) { // 每组6个参数，每参数4字节，共18个参数
            log.error("功能码0x06：无效的数据长度");
            return "";
        }

        StringBuilder tempStr = new StringBuilder();
        for (int i = 0; i < 3; i++) {
            int baseIndex = i * 24;
            int position = ((data[baseIndex] & 0xFF) << 8) | (data[baseIndex + 1] & 0xFF);
            int temperature = ((data[baseIndex + 2] & 0xFF) << 8) | (data[baseIndex + 3] & 0xFF);
            int faultInfo = ((data[baseIndex + 4] & 0xFF) << 8) | (data[baseIndex + 5] & 0xFF);
            int workStatus = ((data[baseIndex + 6] & 0xFF) << 8) | (data[baseIndex + 7] & 0xFF);
            int isolationDoorStatus = ((data[baseIndex + 8] & 0xFF) << 8) | (data[baseIndex + 9] & 0xFF);

            log.info("0x06设备编码: " + deviceAddress +
                    ", 组 " + (i + 1) +
                    ": 位置=" + position +
                    ", 温度=" + temperature +
                    ", 故障信息=" + faultInfo +
                    ", 工作状态=" + workStatus +
                    ", 隔离门状态=" + isolationDoorStatus);
            tempStr.append(position).append("#").append(temperature).append("#").append(faultInfo).append("#").append(workStatus).append("#").append(isolationDoorStatus).append("#");
        }
        if (!tempStr.isEmpty() && tempStr.charAt(tempStr.length() - 1) == '#') {
            tempStr.deleteCharAt(tempStr.length() - 1);
        }
        return tempStr.toString();

    }
    /**
     * ***** 功能码 0x15：检修信息
     * 作用：反馈检修信息
     * 数据域包含：
     * 1. 机械臂当前目标坐标（8 字节，长整型）。
     * 2. 当前孔洞风速（4 字节，浮点型）。
     * 3. 当前孔洞粉尘浓度（4 字节，浮点型）。
     */
    private static String handleFunctionCode15(int deviceAddress, byte[] dataField) {
        long targetCoordinates = ByteBuffer.wrap(dataField, 0, 8).getLong();
        float windSpeed = ByteBuffer.wrap(dataField, 8, 4).getFloat();
        float dustConcentration = ByteBuffer.wrap(dataField, 12, 4).getFloat();

        log.info("0x15设备编码: " + deviceAddress +
                "目标坐标: " + targetCoordinates +
                "当前风速: " + windSpeed +
                "粉尘浓度: " + dustConcentration);
        return targetCoordinates + "#" +
                windSpeed + "#" +
                dustConcentration;
    }
    /**
     * ***** 功能码 0x16：反馈当前孔洞照片
     * 数据域包含：
     * 1. 识别成功照片（文件数据，变长）。
     * 2. 识别失败照片（文件数据，变长）。
     */
    //TODO 照片数据不清楚
    private static String handleFunctionCode16(int deviceAddress, byte[] dataField) {
        // 假设成功照片和失败照片以固定长度分隔
        byte[] successPhoto = Arrays.copyOfRange(dataField, 0, dataField.length / 2);
        byte[] failurePhoto = Arrays.copyOfRange(dataField, dataField.length / 2, dataField.length);

        log.info("0x16设备编码: " + deviceAddress +
                "成功照片: " + Arrays.toString(successPhoto) +
                "失败照片: " + Arrays.toString(failurePhoto));
        return "";
    }
    /**
     * ***** 功能码 0x17：封堵信息
     * 作用：反馈当前封堵信息
     * 数据域包含：
     * 1. 已经封堵孔洞坐标（8 字节，长整型）。
     * 2. 需要封堵的孔洞信息（每个孔洞 8 字节，长整型）。
     * 3. 需要复检的孔洞信息（每个孔洞 8 字节，长整型）。
     * 4. 机械臂封堵工作状态（1 字节，0 表示自动，1 表示手动）。
     * 5. 封堵是否到位（1 字节，0 表示未到位，1 表示到位）。
     */
    //TODO 不确定 需要封堵 复检的孔洞信息 不确定多少个
    private static String handleFunctionCode17(int deviceAddress, byte[] dataField) {
        long sealedCoordinates = ByteBuffer.wrap(dataField, 0, 8).getLong();
        int offset = 8;
        StringBuilder result = new StringBuilder();

        // 需要封堵的孔洞信息:
        while (offset + 8 <= dataField.length) {
            long holeInfo = ByteBuffer.wrap(dataField, offset, 8).getLong();
            result.append(holeInfo).append(" ");
            offset += 8;
        }
        // 机械臂封堵工作状态
        byte armStatus = dataField[offset];
        offset += 1;
        // 封堵是否到位
        byte sealStatus = dataField[offset];

        log.info("0x17设备编码: " + deviceAddress +
                "已封堵孔洞坐标: " + sealedCoordinates +
                "需要封堵的孔洞信息: " + result +
                "机械臂封堵工作状态: " + armStatus +
                "封堵是否到位: " + sealStatus);
        return "";

    }

    /**
     * ***** 功能码 0x18：故障监控
     * 作用：反馈机器人温度监控、电流监控、通讯状态监控、气路状态监控
     * 数据域包含：
     * 1. 电气箱温度（2 字节，短整型）。
     * 2. 电机温度（4 字节，浮点型）。
     * 3. 机械臂各轴温度（12 字节，每个轴 2 字节，短整型）。
     * 4. 工装夹具温度（2 字节，短整型）。
     * 5. 工装盒内温度（4 字节，浮点型）。
     * 6. 电机电流（8 字节，长整型）。
     * 7. 机械臂电流（4 字节，浮点型）。
     * 8. 机械臂通讯状态（1 字节，0 表示正常，1 表示异常）。
     * 9. 电机通讯状态（1 字节，0 表示正常，1 表示异常）。
     * 10. 电气箱通讯状态（1 字节，0 表示正常，1 表示异常）。
     * 11. 净气室工控机通讯状态（1 字节，0 表示正常，1 表示异常）。
     * 12. 气路状态监控（2 字节，每位表示一个气路状态）。
     */
    private static String handleFunctionCode18(int deviceAddress, byte[] dataField) {
        short electricalBoxTemp = ByteBuffer.wrap(dataField, 0, 2).getShort();
        float motorTemp = ByteBuffer.wrap(dataField, 2, 4).getFloat();

        short[] armTemperatures = new short[6]; // 6个轴
        int offset = 6;
        for (int i = 0; i < 6; i++) {
            armTemperatures[i] = ByteBuffer.wrap(dataField, offset, 2).getShort();
            offset += 2;
        }

        short fixtureTemp = ByteBuffer.wrap(dataField, offset, 2).getShort();
        offset += 2;

        float fixtureBoxTemp = ByteBuffer.wrap(dataField, offset, 4).getFloat();
        offset += 4;

        long motorCurrent = ByteBuffer.wrap(dataField, offset, 8).getLong();
        offset += 8;

        float armCurrent = ByteBuffer.wrap(dataField, offset, 4).getFloat();
        offset += 4;

        byte armCommStatus = dataField[offset];
        offset += 1;

        byte motorCommStatus = dataField[offset];
        offset += 1;

        byte electricalBoxCommStatus = dataField[offset];
        offset += 1;

        byte airRoomCommStatus = dataField[offset];
        offset += 1;

        short airLineStatus = ByteBuffer.wrap(dataField, offset, 2).getShort();

        // 使用 log.info() 输出日志
        log.info("功能码 0x18 - 故障监控: " +
                "设备地址: " + deviceAddress +
                ", 电气箱温度: " + electricalBoxTemp +
                ", 电机温度: " + motorTemp +
                ", 机械臂各轴温度: " + Arrays.toString(armTemperatures) +
                ", 工装夹具温度: " + fixtureTemp +
                ", 工装盒内温度: " + fixtureBoxTemp +
                ", 电机电流: " + motorCurrent +
                ", 机械臂电流: " + armCurrent +
                ", 机械臂通讯状态: " + (armCommStatus == 0 ? "正常" : "异常") +
                ", 电机通讯状态: " + (motorCommStatus == 0 ? "正常" : "异常") +
                ", 电气箱通讯状态: " + (electricalBoxCommStatus == 0 ? "正常" : "异常") +
                ", 净气室工控机通讯状态: " + (airRoomCommStatus == 0 ? "正常" : "异常") +
                ", 气路状态监控: " + Integer.toBinaryString(airLineStatus));
        return String.format("%s#%s#%s#%s#%s#%s#%s#%s#%s#%s#%s#%s#%s",
                deviceAddress,
                electricalBoxTemp,
                motorTemp,
                Arrays.toString(armTemperatures),
                fixtureTemp,
                fixtureBoxTemp,
                motorCurrent,
                armCurrent,
                (armCommStatus == 0 ? "正常" : "异常"),
                (motorCommStatus == 0 ? "正常" : "异常"),
                (electricalBoxCommStatus == 0 ? "正常" : "异常"),
                (airRoomCommStatus == 0 ? "正常" : "异常"),
                Integer.toBinaryString(airLineStatus)
        );
    }

    /**
     * ***** 功能码 0x19：机器人工作状态
     * 作用：反馈机器人当前工作状态
     * 数据域包含：
     * 1. 第一字节（1 字节）：
     *    0x01 - 前往待机位。
     *    0x02 - 前往工作准备位。
     *    0x03 - 当前在第几列。
     *    0x04 - 检修中。
     *    0x05 - 异常。
     * 2. 第二字节（1 字节）：具体状态数据。
     */
    private static String handleFunctionCode19(int deviceAddress, byte[] dataField) {
        byte stateCode = dataField[0];
        byte additionalInfo = dataField[1];

        System.out.println("功能码 0x19 - 工作状态:");
        System.out.println("设备地址: " + deviceAddress);
        String result;
        switch (stateCode) {
            case 0x01:
                result = "前往待机位";
                System.out.println("状态: 前往待机位");
                break;
            case 0x02:
                result = "前往工作准备位";
                System.out.println("状态: 前往工作准备位");
                break;
            case 0x03:
                result = "当前在第 " + additionalInfo + " 列";
                System.out.println("状态: 当前在第 " + additionalInfo + " 列");
                break;
            case 0x04:
                result = "检修中";
                System.out.println("状态: 检修中");
                break;
            case 0x05:
                result = "异常，代码: " + additionalInfo;
                System.out.println("状态: 异常，代码: " + additionalInfo);
                break;
            default:
                result = "未知状态码: " + stateCode;
                System.out.println("未知状态码: " + stateCode);
        }
        return result;
    }
    /**
     * ***** 功能码 0x1A：机器人急停状态
     * 数据域包含：
     * 1. 急停状态（1 字节）：
     *    0 表示抬起。
     *    1 表示按下。
     */
    private static String handleFunctionCode1A(int deviceAddress, byte[] dataField) {
        byte emergencyStop = dataField[0];
        System.out.println("功能码 0x1A - 急停状态:");
        System.out.println("设备地址: " + deviceAddress);
        System.out.println("急停状态: " + (emergencyStop == 0 ? "抬起" : "按下"));
        return  (emergencyStop == 0 ? "抬起" : "按下");
    }
    /**
     * ***** 功能码 0x24：反馈当前位置
     * 数据域包含当前位置，格式为 8 字节长整型，表示设备当前位置。
     */
    private static String handleFunctionCode24(int deviceAddress, byte[] dataField) {
        long currentPosition = ByteBuffer.wrap(dataField).getLong();
        System.out.println("功能码 0x24 - 当前位置:");
        System.out.println("设备地址: " + deviceAddress);
        System.out.println("当前位置: " + currentPosition);
        return String.valueOf(currentPosition);
    }
    /**
     * ***** 功能码 0x25：反馈当前坐标
     * 数据域包含当前坐标，格式为 8 字节长整型，表示设备当前坐标。
     */
    private static String handleFunctionCode25(int deviceAddress, byte[] dataField) {
        long currentCoordinate = ByteBuffer.wrap(dataField).getLong();
        System.out.println("功能码 0x25 - 当前坐标:");
        System.out.println("设备地址: " + deviceAddress);
        System.out.println("当前坐标: " + currentCoordinate);
        return String.valueOf(currentCoordinate);
    }
    /**
     * ***** 功能码 0x26：反馈是否到位
     * 数据域包含 1 个字节，表示是否到位：
     * 0 - 未到位，1 - 到位。
     */
    private static String handleFunctionCode26(int deviceAddress, byte[] dataField) {
        byte isPositioned = dataField[0];
        System.out.println("功能码 0x26 - 是否到位:");
        System.out.println("设备地址: " + deviceAddress);
        System.out.println("到位状态: " + (isPositioned == 1 ? "到位" : "未到位"));
        return (isPositioned == 1 ? "到位" : "未到位");
    }
    /**
     * ***** 功能码 0x2B：故障监控
     * 数据域包含：
     * 1. 电机电流（2 字节，短整型）。
     * 2. 电机故障（2 字节，短整型）。
     * 3. 脉冲控制模块状态（1 字节）。
     * 4. 电机通讯状态（1 字节）。
     * 5. 工控机通讯状态（1 字节）。
     * 6. 光学读头状态（1 字节）。
     */
    private static String handleFunctionCode2B(int deviceAddress, byte[] dataField) {
        short motorCurrent = ByteBuffer.wrap(dataField, 0, 2).getShort();
        short motorFault = ByteBuffer.wrap(dataField, 2, 2).getShort();
        byte pulseModuleStatus = dataField[4];
        byte motorCommunicationStatus = dataField[5];
        byte ipcCommunicationStatus = dataField[6];
        byte opticalHeadStatus = dataField[7];

        System.out.println("功能码 0x2B - 故障监控:");
        System.out.println("设备地址: " + deviceAddress);
        System.out.println("电机电流: " + motorCurrent);
        System.out.println("电机故障: " + motorFault);
        System.out.println("脉冲控制模块状态: " + pulseModuleStatus);
        System.out.println("电机通讯状态: " + motorCommunicationStatus);
        System.out.println("工控机通讯状态: " + ipcCommunicationStatus);
        System.out.println("光学读头状态: " + opticalHeadStatus);
        return String.format("%s#%s#%s#%s#%s#%s",
                motorCurrent,
                motorFault,
                pulseModuleStatus,
                motorCommunicationStatus,
                ipcCommunicationStatus,
                opticalHeadStatus);

    }
    /**
     * ***** 功能码 0x2C：反馈工作状态
     * 数据域包含：
     * 1. 当前状态（1 字节）。
     * 2. 当前当前位置（4 字节，整型）。
     * 3. 是否在检修中（1 字节，0 表示否，1 表示是）。
     * 4. 是否异常（1 字节，0 表示否，1 表示是）。
     * 5. 急停状态（1 字节，0 表示抬起，1 表示按下）。
     */
    private static String handleFunctionCode2C(int deviceAddress, byte[] dataField) {
        byte currentState = dataField[0];
        long currentPosition = ByteBuffer.wrap(dataField, 1, 4).getInt();
        byte isUnderMaintenance = dataField[5];
        byte hasError = dataField[6];
        byte emergencyStop = dataField[7];

        System.out.println("功能码 0x2C - 工作状态:");
        System.out.println("设备地址: " + deviceAddress);
        System.out.println("当前状态: " + currentState);
        System.out.println("当前位置: " + currentPosition);
        System.out.println("是否在检修中: " + (isUnderMaintenance == 1 ? "是" : "否"));
        System.out.println("是否异常: " + (hasError == 1 ? "是" : "否"));
        System.out.println("急停状态: " + (emergencyStop == 1 ? "按下" : "抬起"));
        return String.format("%s#%s#%s#%s#%s",
                currentState,
                currentPosition,
                (isUnderMaintenance == 1 ? "是" : "否"),
                (hasError == 1 ? "是" : "否"),
                (emergencyStop == 1 ? "按下" : "抬起"));
    }
    /**
     * ***** 功能码 0x42：滑台反馈信息
     * 数据域包含：
     * 1. 当前速度（4 字节，浮点型）。
     * 2. 当前坐标（8 字节，长整型）。
     * 3. 是否到位（1 字节，0 表示未到位，1 表示到位）。
     */
    private static String handleFunctionCode42(int deviceAddress, byte[] dataField) {
        float currentSpeed = ByteBuffer.wrap(dataField, 0, 4).getFloat();
        long currentCoordinate = ByteBuffer.wrap(dataField, 4, 4).getLong();
        byte isPositioned = dataField[8];

        System.out.println("功能码 0x42 - 滑台反馈信息:");
        System.out.println("设备地址: " + deviceAddress);
        System.out.println("当前速度: " + currentSpeed);
        System.out.println("当前坐标: " + currentCoordinate);
        System.out.println("是否到位: " + (isPositioned == 1 ? "到位" : "未到位"));
        return String.format("%s#%s#%s",
                currentSpeed,
                currentCoordinate,
                (isPositioned == 1 ? "到位" : "未到位"));
    }
    /**
     * ***** 功能码 0x43：滑台故障监控
     * 数据域包含：
     * 1. 电机电流（4 组，每组 2 字节，共 8 字节）。
     * 2. 电机通讯状态（1 字节）。
     * 3. 与下位机通讯状态（1 字节）。
     */
    private static String handleFunctionCode43(int deviceAddress, byte[] dataField) {
        short[] motorCurrents = new short[4];
        for (int i = 0; i < 4; i++) {
            motorCurrents[i] = ByteBuffer.wrap(dataField, i * 2, 2).getShort();
        }
        byte motorCommunicationStatus = dataField[8];
        byte subMachineCommunicationStatus = dataField[9];

        System.out.println("功能码 0x43 - 滑台故障监控:");
        System.out.println("设备地址: " + deviceAddress);
        for (int i = 0; i < motorCurrents.length; i++) {
            System.out.println("电机 " + (i + 1) + " 电流: " + motorCurrents[i]);
        }
        System.out.println("电机通讯状态: " + motorCommunicationStatus);
        System.out.println("与下位机通讯状态: " + subMachineCommunicationStatus);

        return String.format("%s#%s#%s",
                Arrays.toString(motorCurrents),
                motorCommunicationStatus,
                subMachineCommunicationStatus);
    }
    /**
     * ***** 功能码 0x44：滑台反馈工作状态
     * 数据域包含：
     * 1. 当前状态（1 字节）。
     * 2. 当前坐标（4 字节，整型）。
     * 3. 是否在检修中（1 字节，0 表示否，1 表示是）。
     * 4. 是否异常（1 字节，0 表示否，1 表示是）。
     */
    private static String handleFunctionCode44(int deviceAddress, byte[] dataField) {
        byte currentState = dataField[0];
        long currentCoordinate = ByteBuffer.wrap(dataField, 1, 4).getLong();
        byte isUnderMaintenance = dataField[5];
        byte hasError = dataField[6];

        System.out.println("功能码 0x44 - 滑台反馈工作状态:");
        System.out.println("设备地址: " + deviceAddress);
        System.out.println("当前状态: " + currentState);
        System.out.println("当前坐标: " + currentCoordinate);
        System.out.println("是否在检修中: " + (isUnderMaintenance == 1 ? "是" : "否"));
        System.out.println("是否异常: " + (hasError == 1 ? "是" : "否"));
        return String.format("%s#%s#%s#%s",
                currentState,
                currentCoordinate,
                (isUnderMaintenance == 1 ? "是" : "否"),
                (hasError == 1 ? "是" : "否"));
    }
    /**
     * ***** 功能码 0x45：急停状态
     * 数据域包含 1 个字节：
     * 0 - 抬起状态，1 - 按下状态。
     */
    private static String handleFunctionCode45(int deviceAddress, byte[] dataField) {
        byte emergencyStop = dataField[0];
        System.out.println("功能码 0x45 - 急停状态:");
        System.out.println("设备地址: " + deviceAddress);
        System.out.println("急停状态: " + (emergencyStop == 0 ? "抬起" : "按下"));
        return (emergencyStop == 0 ? "抬起" : "按下");
    }
    /**
     * ***** 功能码 0x50：系统数据上报
     * 数据域为变长数据，包含系统运行的详细信息，可按需解析。
     */
    private static String handleFunctionCode50(int deviceAddress, byte[] dataField) {
        System.out.println("功能码 0x50 - 系统数据上报:");
        System.out.println("设备地址: " + deviceAddress);
        System.out.println("上报数据: " + Arrays.toString(dataField));
        return Arrays.toString(dataField);
    }
}
